#if !defined(__APP_DEVICE_H)
#define __APP_DEVICE_H

#include <pthread.h>
#include "app_buffer.h"
#include "app_message.h"
#include "app_pool.h"

// 设备类型枚举
typedef enum
{
    SERIAL = 1,
    IIC,
    SPI,
    CAN,
    GENERAL
} DeviceType;

// 包含设备相关的由子类或其它模块指定的函数指针的结构体
typedef struct
{
    // 读取到设备文件后执行的后处理函数   由子类实现
    void *(*post_read)(Device *, void *, int);
    // 写入设备文件前执行的前处理函数   由子类实现
    void *(*pre_write)(Device *, void *, int);
    // 发送消息给远程服务器的函数  由其它模块来注册实现 
    void *(*send_msg)(Device *, void *, int);
} DeviceFuncs;

typedef struct
{
    char *name; // 设备名称
    int fd; // 设备文件描述符
    DeviceType type; // 设备类型
    ConnectionType conn_type; // 连接类型
    Buffer *read_buffer; // 读取缓冲区
    Buffer *write_buffer; // 写入缓冲区
    pthread_t read_thread; // 读取设备文件的线程
    int running; // 设备是否正在运行
    unsigned long last_write_time; // 上一次写入时间
    DeviceFuncs *funcs; // 设备函数指针
} Device;

/**
 * @brief 初始化设备
 * @param filename 设备文件名
 * @return Device* 设备指针
 */
Device *app_device_init(char *filename);

/**
 *  @brief 启动设备
 *  @param device 设备指针
 *  @return int 0:成功 -1:失败
 */
int app_device_start(Device *device);

/**
 * @brief 停止设备
 * @param device 设备指针
 * @return int 0:成功 -1:失败
 */
int app_device_stop(Device *device);

/**
 * @brief 关闭设备
 * @param device 设备指针
 * @return void
 */
void app_device_close(Device *device);

/**
 * @breif 读取设备文件数据的线程函数
 * @param argv 接收的数据指针，最终是Device指针
 * @return void* 最终是NULL
 */
void *app_device_read(void *argv);

/**
 * @brief 发送消息的任务函数
 * @param argv 接收的数据指针，最终是Device指针
 * @return void* 最终是NULL
 */
void *app_device_sendTask(void *argv);

/**
 * @brief 接收消息的回调
 * @param device 设备指针
 * @param ptr 接收到的数据指针
 * @param len 数据长度
 */
int app_device_recvMsg(Device *device, void *ptr, int len);

/**
 * @brief 写入设备文件数据的任务函数
 * @param argv 接收的数据指针，最终是Device指针
 * @return void* 最终是NULL
 */
void *app_device_writeTask(void *argv);

#endif // __APP_DEVICE_H
